home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / 8087.arc / ASC.ASM < prev    next >
Encoding:
Assembly Source File  |  1985-02-13  |  5.4 KB  |  119 lines

  1.         PAGE    ,132
  2.         TITLE   Floating point to ASCII Conversion
  3. IF1
  4. INCLUDE 87MAC.LIB
  5. ENDIF
  6. CODE    SEGMENT PUBLIC
  7.         ASSUME  CS:CODE,DS:CODE,ES:CODE
  8.         EXTRN   TEN_TO_X:NEAR
  9. OLD_CW          DW      ?
  10. NEW_CW          DW      ?
  11. EXPONENT        DW      ?
  12. BCD_RESULT      DT      ?
  13. BCD_EXPONENT    DT      ?
  14. TEN8            DD      100000000
  15. PRINT_STRING    DB      '  .      E      ',13,10,'$'
  16.         PUBLIC  FLOAT_ASCII
  17. ;-----------------------------------------------;
  18. ; This routine takes the top element of the     ;
  19. ;  8087 stack and displays the floating point   ;
  20. ;  value.                                       ;
  21. ; Input -- ST0 of the 8087                      ;
  22. ; Output -- Value is displayed, stack is popped ;
  23. ;-----------------------------------------------;
  24. FLOAT_ASCII     PROC    NEAR
  25.                                 ;------ST0------;------ST1------;------ST2----
  26.                                 ;       X       ;               ;
  27.         FLD     ST0             ;       X       ;       X       ;       ?
  28.         FABS                    ;      |X|      ;       X       ;
  29.         FLD1                    ;       1       ;       X       ;       X
  30.         FXCH    ST1             ;       X       ;       1       ;       X
  31.         FYL2X                   ;    LOG2(X)    ;       X       ;       ?
  32.         FLDL2T                  ;    LOG2(10)   ;    LOG2(X)    ;       X
  33.         FDIVRP  ST1,ST0         ;E=LOGX/LOG10   ;       X       ;       ?
  34.         FNSTCW  OLD_CW          ;               ;               ;
  35.         FWAIT                   ;               ;               ;
  36.         MOV     AX,OLD_CW       ;               ;               ;
  37.         AND     AX, NOT 0C00H   ;               ;               ;
  38.         OR      AX, 0400H       ;               ;               ;
  39.         MOV     NEW_CW,AX       ;               ;               ;
  40.         FLDCW   NEW_CW          ;               ;               ;
  41.         FRNDINT                 ;  I= INT(E)    ;       X       ;       ?
  42.         FLDCW   OLD_CW          ;               ;               ;
  43.         FIST    EXPONENT        ;       I       ;       X       ;       ?
  44.         FCHS                    ;      -I       ;       X       ;       ?
  45.         CALL    TEN_TO_X        ;  10 **(-I)    ;       X       ;       ?
  46.         FMULP   ST1,ST0         ;  X/10**I      ;       ?       ;       ?
  47.         FIMUL   TEN8            ; ADJUSTED FRAC ;       ?       ;       ?
  48.         FBSTP   BCD_RESULT      ;       ?       ;       ?       ;       ?
  49.         FILD    EXPONENT        ;       I       ;       ?       ;       ?
  50.         FBSTP   BCD_EXPONENT    ;       ?       ;       ?       ;       ?
  51.  
  52. ;----- Display the values stored as BCD strings
  53.  
  54.         CLD
  55.         MOV     DI,OFFSET PRINT_STRING          ; Point at output string
  56.         MOV     AL,BYTE PTR BCD_RESULT+9
  57.         CALL    PRINT_SIGN                      ; Print the sign
  58.         MOV     AL,BYTE PTR BCD_RESULT+4
  59.         CALL    PRINT_NYBBLE                    ; Print the leading digit
  60.         MOV     AL,'.'                          ; The decimal point
  61.         STOSB
  62.         MOV     BX,OFFSET BCD_RESULT+3
  63.         MOV     CX,4                            ; Loop through the 8
  64. DO_BYTE:                                        ;  digits following
  65.         CALL    PRINT_BYTE                      ;  the decimal point
  66.         LOOP    DO_BYTE
  67.         MOV     AL,'E'                          ; Exponent indicator
  68.         STOSB
  69.         MOV     AL,BYTE PTR BCD_EXPONENT+9
  70.         CALL    PRINT_SIGN                      ; Print exponent sign
  71.         MOV     AL,BYTE PTR BCD_EXPONENT+1
  72.         CALL    PRINT_NYBBLE                    ; Print first digit
  73.         MOV     BX,OFFSET BCD_EXPONENT
  74.         CALL    PRINT_BYTE                      ; Last two digits of exp
  75.         MOV     DX,OFFSET PRINT_STRING
  76.         MOV     AH,9
  77.         INT     21H                             ; Use DOS to print the string
  78.         RET
  79. FLOAT_ASCII     ENDP
  80.  
  81. ;----- This routine prints a ' ' or '-'
  82.  
  83. PRINT_SIGN      PROC    NEAR
  84.         CMP     AL,0                    ; Test for minus sign
  85.         MOV     AL,' '                  ; Positive
  86.         JZ      POSITIVE
  87.         MOV     AL,'-'                  ; Mark as negative
  88. POSITIVE:
  89.         STOSB                           ; Put sign in the print string
  90.         RET
  91. PRINT_SIGN      ENDP
  92.  
  93. ;------ This routine prints the two decimal
  94. ;------  digits pointed to by [BX]
  95.  
  96. PRINT_BYTE      PROC    NEAR
  97.         MOV     AL,[BX]                 ; Get BCD byte
  98.         PUSH    CX
  99.         MOV     CL,4
  100.         SHR     AL,CL                   ; Shift high nybble to low portion
  101.         POP     CX
  102.         CALL    PRINT_NYBBLE            ; Print high nybble
  103.         MOV     AL,[BX]                 ; Get original value back
  104.         CALL    PRINT_NYBBLE            ; Print low nybble
  105.         DEC     BX                      ; Move to next byte in string
  106.         RET
  107. PRINT_BYTE      ENDP
  108.  
  109. ;------ Print as decimal the AL value
  110.  
  111. PRINT_NYBBLE    PROC    NEAR
  112.         AND     AL,0FH                  ; Isolate low nybble
  113.         ADD     AL,'0'                  ; Convert to ASCII value
  114.         STOSB                           ; Store in print string
  115.         RET
  116. PRINT_NYBBLE    ENDP
  117. CODE    ENDS
  118.         END     FLOAT_ASCII
  119.